package org.example.CAS;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 定义原子变量：使用AtomicInteger类定义了一个名为counter的原子整型变量，并初始化为0。
 *
 * 创建线程：在main方法中创建了10个线程，每个线程将对counter进行1000次自增操作。
 *
 * 使用CAS操作：在每个线程的运行方法中，使用compareAndSet方法尝试将counter的值从当前值j更新为j + 1。
 * 如果compareAndSet返回false（即当前值不等于预期值j），则循环继续尝试，直到成功更新。
 *
 * 等待所有线程完成：使用Thread.activeCount()和Thread.yield()来等待所有线程完成执行。
 *
 * 输出最终结果：当所有线程都执行完毕后，输出counter的最终值。
 *
 * 工作原理
 * compareAndSet方法首先检查当前值是否等于预期值，如果是，则将值更新为新值，并返回true。
 * 如果当前值不等于预期值，则不进行更新，并返回false。
 * 通过循环调用compareAndSet，确保在其他线程可能已经修改了counter的情况下，仍然能够正确地更新值。
 * 这种方法避免了使用传统的同步机制（如synchronized），从而减少了锁的开销，提高了并发性能。CAS操作是原子的，因此可以安全地在多线程环境中使用。
 */
public class CASDemo {
    private static AtomicInteger counter = new AtomicInteger(0);

    public static void main(String[] args) {
        // 创建多个线程来模拟并发访问
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                for (int j = 0; j < 1000; j++) {
                    // 使用CAS操作更新counter的值
                    while (!counter.compareAndSet(j, j + 1)) {
                        // 如果compareAndSet失败，则继续循环直到成功
                    }
                }
            }, "Thread-" + i).start();
        }

        while (Thread.activeCount() > 1) { 
            Thread.yield();
        }

        System.out.println("Final counter value: " + counter.get());
    }
}